package borrador;

import java.util.LinkedList;
import java.util.List;

import logica.AtributoCompuesto;
import logica.AtributoIdentificadorFaltanteException;
import logica.AtributoRepetidoException;
import logica.AtributoSimple;
import logica.Diagrama;
import logica.Entidad;
import logica.EntidadIdentificadoraFaltanteException;
import logica.EntidadRepetidaException;
import logica.EntidadRol;
import logica.IdExternoInexistenteException;
import logica.IdExternoRepetidoException;
import logica.Identificador;
import logica.IdentificadorVacioException;
import logica.Jerarquia;
import logica.JerarquiaException;
import logica.Proyecto;
import logica.Relacion;
import logica.RelacionException;
import logica.SinNombreException;

public class CtaCte {
	private Proyecto proy;
	private Diagrama diag;
	
	
	private Entidad producto;
	private Entidad venta;
	private Entidad tarjeta;
	private Entidad credito;
	private Entidad cliente;
	private Entidad pago;
	
	private Relacion v_p;
	private Relacion v_c;
	private Relacion p_c;
	
	private Jerarquia jerarquiaVentas;
	private Jerarquia jerarquiaTarjetas;
	
	public CtaCte() throws SinNombreException, AtributoRepetidoException, RelacionException, JerarquiaException, IdExternoRepetidoException, AtributoIdentificadorFaltanteException, EntidadIdentificadoraFaltanteException, IdentificadorVacioException
	{
		this.crearEntidadProducto();
		this.crearEntidadVenta();
		this.crearEntidadTarjeta();
		this.crearEntidadCredito();
		this.crearEntidadCliente();
		this.crearEntidadPago();
		
		this.crearRelacionV_p();
		this.crearRelacionV_c();
		this.crearRelacionP_c();
		
		this.crearJerarquiaVentas();
		this.crearJerarquiaTarjetas();
		
		this.crearEstructuraProyecto();
	}
	
	public String getNombre() {
		return "CtaCte";
	}
	public Entidad getProducto() {
		return producto;
	}
	public Entidad getVenta() {
		return venta;
	}
	public Entidad getTarjeta() {
		return tarjeta;
	}
	public Entidad getCredito() {
		return credito;
	}
	public Entidad getCliente() {
		return cliente;
	}
	public Entidad getPago() {
		return pago;
	}
	public Relacion getV_p() {
		return v_p;
	}
	public Relacion getV_c() {
		return v_c;
	}
	public Relacion getP_c() {
		return p_c;
	}
	public Jerarquia getJerarquiaVentas() {
		return jerarquiaVentas;
	}
	public Jerarquia getJerarquiaTarjetas() {
		return jerarquiaTarjetas;
	}
	
	private void crearEntidadProducto() throws SinNombreException, AtributoRepetidoException, AtributoIdentificadorFaltanteException, EntidadIdentificadoraFaltanteException, IdentificadorVacioException
	{
		this.producto = new Entidad("Producto");
		
		AtributoSimple codProd = new AtributoSimple("codProd");
		
		this.producto.agregarAtributo(codProd);
		this.producto.agregarAtributo(new AtributoSimple("nomProd"));
		this.producto.agregarAtributo(new AtributoSimple("existencia"));
		this.producto.agregarAtributo(new AtributoSimple("precio"));
		
		Identificador id = new Identificador();
		id.agregarAtributoIdentificador(codProd);
		
		this.producto.agregarIdentificador(id);
	}
	
	private void crearEntidadVenta() throws SinNombreException, AtributoRepetidoException, AtributoIdentificadorFaltanteException, EntidadIdentificadoraFaltanteException, IdentificadorVacioException 
	{
		this.venta = new Entidad("Venta");
		
		AtributoSimple tipoFac = new AtributoSimple("tipoFac");
		AtributoSimple nroFac = new AtributoSimple("nroFac");
		
		this.venta.agregarAtributo(tipoFac);
		this.venta.agregarAtributo(nroFac);
		this.venta.agregarAtributo(new AtributoSimple("fecha"));
		this.venta.agregarAtributo(new AtributoSimple("formaPago"));
		this.venta.agregarAtributo(new AtributoSimple("desc", 0, 1));
		
		Identificador id = new Identificador();
		id.agregarAtributoIdentificador(tipoFac);
		id.agregarAtributoIdentificador(nroFac);
		
		this.venta.agregarIdentificador(id);	
	}
	
	private void crearEntidadTarjeta() throws SinNombreException, AtributoRepetidoException 
	{
		this.tarjeta = new Entidad("Tarjeta");
				
		this.tarjeta.agregarAtributo(new AtributoSimple("nomTarj"));
		this.tarjeta.agregarAtributo(new AtributoSimple("nroTarj"));
		this.tarjeta.agregarAtributo(new AtributoSimple("nroAutriz"));
	}
	
	private void crearEntidadCredito() throws SinNombreException, AtributoRepetidoException 
	{
		this.credito = new Entidad("Credito");
		
		this.credito.agregarAtributo(new AtributoSimple("cuotas"));
		this.credito.agregarAtributo(new AtributoSimple("interes"));
	}
	
	private void crearEntidadCliente() throws SinNombreException, AtributoRepetidoException, AtributoIdentificadorFaltanteException, EntidadIdentificadoraFaltanteException, IdentificadorVacioException 
	{
		this.cliente = new Entidad("Cliente");
		
		AtributoSimple cuiTol = new AtributoSimple("CUIToL");
		AtributoCompuesto domic = new AtributoCompuesto("domic");
		AtributoCompuesto cuenta = new AtributoCompuesto("cuenta");
		
		domic.agregarAtributo(new AtributoSimple("calle"));
		domic.agregarAtributo(new AtributoSimple("ubic"));
		domic.agregarAtributo(new AtributoSimple("localidad"));
		
		cuenta.agregarAtributo(new AtributoSimple("sdoInt"));
		cuenta.agregarAtributo(new AtributoSimple("saldo"));
		
		this.cliente.agregarAtributo(cuiTol);
		this.cliente.agregarAtributo(new AtributoSimple("nombre"));
		this.cliente.agregarAtributo(new AtributoSimple("telefono", 1, -1));
		this.cliente.agregarAtributo(domic);
		this.cliente.agregarAtributo(cuenta);
		
		
		Identificador id = new Identificador();
		id.agregarAtributoIdentificador(cuiTol);
		
		this.cliente.agregarIdentificador(id);
		
	}
	
	private void crearEntidadPago() throws SinNombreException, AtributoRepetidoException, IdExternoRepetidoException, AtributoIdentificadorFaltanteException, EntidadIdentificadoraFaltanteException, IdentificadorVacioException 
	{
		this.pago = new Entidad("Pago");
		
		AtributoSimple fecha = new AtributoSimple("fecha");
				
		this.pago.agregarAtributo(fecha);
		this.pago.agregarAtributo(new AtributoSimple("monto"));
		this.pago.agregarAtributo(new AtributoSimple("montoInt"));
		
		this.pago.agregarEntidadExterna(this.getCliente());
		
		Identificador id = new Identificador();
		id.agregarAtributoIdentificador(fecha);
		id.agregarEntidadIdentificadora(this.getCliente());
		
		this.pago.agregarIdentificador(id);
	}
	
	private void crearRelacionV_p() throws RelacionException, SinNombreException, AtributoRepetidoException 
	{
		List<EntidadRol> entidades = new LinkedList<EntidadRol>();
		
		entidades.add(new EntidadRol(this.getProducto(), "", 0, -1));
		entidades.add(new EntidadRol(this.getVenta(), "", 1, -1));
		
		this.v_p = new Relacion("V/P", entidades);
		
		this.v_p.agregarAtributo(new AtributoSimple("cant"));
		this.v_p.agregarAtributo(new AtributoSimple("precioVta"));
	}
	
	private void crearRelacionV_c() throws RelacionException, SinNombreException
	{
		List<EntidadRol> entidades = new LinkedList<EntidadRol>();
		
		entidades.add(new EntidadRol(this.getCliente(), "", 1, -1));
		entidades.add(new EntidadRol(this.getVenta(), "", 1, 1));
		
		this.v_c = new Relacion("V/C", entidades);
	}
	
	private void crearRelacionP_c() throws RelacionException, SinNombreException 
	{
		List<EntidadRol> entidades = new LinkedList<EntidadRol>();
		
		entidades.add(new EntidadRol(this.getCliente(), "", 0, -1));
		entidades.add(new EntidadRol(this.getPago(), "", 1, 1));
		
		this.p_c = new Relacion("P/C", entidades);
		
	}
	
	private void crearJerarquiaVentas() throws JerarquiaException, SinNombreException 
	{
		List<Entidad> entidades = new LinkedList<Entidad>();
		
		entidades.add(this.getTarjeta());
		
		this.jerarquiaVentas = new Jerarquia("Jerarquia Ventas", this.getVenta(), entidades, true, true);
	}
	
	private void crearJerarquiaTarjetas() throws JerarquiaException, SinNombreException 
	{
		List<Entidad> entidades = new LinkedList<Entidad>();
		
		entidades.add(this.getCredito());
		
		this.jerarquiaTarjetas = new Jerarquia("Jerarquia Credito", this.getTarjeta(), entidades, false, false);
	}
	
	public void crearEstructuraProyecto () {
		try {
			proy = new Proyecto(this.getNombre());
			diag = proy.getDiagramaPpal();
			
			try {
				diag.agregarObjetoDiagrama(this.getCliente());
				diag.agregarObjetoDiagrama(this.getCredito());
				diag.agregarObjetoDiagrama(this.getTarjeta());
				diag.agregarObjetoDiagrama(this.getPago());
				diag.agregarObjetoDiagrama(this.getP_c());
				diag.agregarObjetoDiagrama(this.getProducto());
				diag.agregarObjetoDiagrama(this.getVenta());		
				diag.agregarObjetoDiagrama(this.getV_c());
				diag.agregarObjetoDiagrama(this.getV_p());
				diag.agregarObjetoDiagrama(this.getJerarquiaTarjetas());
				diag.agregarObjetoDiagrama(this.getJerarquiaVentas());
		
								
			} 
			catch (IdExternoInexistenteException e) {
					e.printStackTrace();
			} catch (EntidadRepetidaException e) {
				e.printStackTrace();
			}
		
				
		} catch (SinNombreException e) {
			e.printStackTrace();
		}
		
		
	}
	
	public Proyecto getProyecto () {
		return proy;
	}
}
